home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / PIL / SpiderImagePlugin.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  7KB  |  274 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import Image
  5. import ImageFile
  6. import os
  7. import string
  8. import struct
  9. import sys
  10.  
  11. def isInt(f):
  12.     
  13.     try:
  14.         i = int(f)
  15.         if f - i == 0:
  16.             return 1
  17.         else:
  18.             return 0
  19.     except:
  20.         return 0
  21.  
  22.  
  23. iforms = [
  24.     1,
  25.     3,
  26.     -11,
  27.     -12,
  28.     -21,
  29.     -22]
  30.  
  31. def isSpiderHeader(t):
  32.     h = (99,) + t
  33.     for i in [
  34.         1,
  35.         2,
  36.         5,
  37.         12,
  38.         13,
  39.         22,
  40.         23]:
  41.         if not isInt(h[i]):
  42.             return 0
  43.             continue
  44.     
  45.     iform = int(h[5])
  46.     if iform not in iforms:
  47.         return 0
  48.     
  49.     labrec = int(h[13])
  50.     labbyt = int(h[22])
  51.     lenbyt = int(h[23])
  52.     if labbyt != labrec * lenbyt:
  53.         return 0
  54.     
  55.     return labbyt
  56.  
  57.  
  58. def isSpiderImage(filename):
  59.     fp = open(filename, 'rb')
  60.     f = fp.read(92)
  61.     fp.close()
  62.     bigendian = 1
  63.     t = struct.unpack('>23f', f)
  64.     hdrlen = isSpiderHeader(t)
  65.     if hdrlen == 0:
  66.         bigendian = 0
  67.         t = struct.unpack('<23f', f)
  68.         hdrlen = isSpiderHeader(t)
  69.     
  70.     return hdrlen
  71.  
  72.  
  73. class SpiderImageFile(ImageFile.ImageFile):
  74.     format = 'SPIDER'
  75.     format_description = 'Spider 2D image'
  76.     
  77.     def _open(self):
  78.         n = 108
  79.         f = self.fp.read(n)
  80.         
  81.         try:
  82.             self.bigendian = 1
  83.             t = struct.unpack('>27f', f)
  84.             hdrlen = isSpiderHeader(t)
  85.             if hdrlen == 0:
  86.                 self.bigendian = 0
  87.                 t = struct.unpack('<27f', f)
  88.                 hdrlen = isSpiderHeader(t)
  89.             
  90.             if hdrlen == 0:
  91.                 raise SyntaxError, 'not a valid Spider file'
  92.         except struct.error:
  93.             raise SyntaxError, 'not a valid Spider file'
  94.  
  95.         h = (99,) + t
  96.         iform = int(h[5])
  97.         if iform != 1:
  98.             raise SyntaxError, 'not a Spider 2D image'
  99.         
  100.         self.size = (int(h[12]), int(h[2]))
  101.         self.istack = int(h[24])
  102.         self.imgnumber = int(h[27])
  103.         if self.istack == 0 and self.imgnumber == 0:
  104.             offset = hdrlen
  105.             self.nimages = 1
  106.         elif self.istack > 0 and self.imgnumber == 0:
  107.             self.imgbytes = int(h[12]) * int(h[2]) * 4
  108.             self.hdrlen = hdrlen
  109.             self.nimages = int(h[26])
  110.             offset = hdrlen * 2
  111.             self.imgnumber = 1
  112.         elif self.istack == 0 and self.imgnumber > 0:
  113.             offset = hdrlen + self.stkoffset
  114.             self.istack = 2
  115.         else:
  116.             raise SyntaxError, 'inconsistent stack header values'
  117.         if self.bigendian:
  118.             self.rawmode = 'F;32BF'
  119.         else:
  120.             self.rawmode = 'F;32F'
  121.         self.mode = 'F'
  122.         self.tile = [
  123.             ('raw', (0, 0) + self.size, offset, (self.rawmode, 0, 1))]
  124.         self._SpiderImageFile__fp = self.fp
  125.  
  126.     
  127.     def tell(self):
  128.         if self.imgnumber < 1:
  129.             return 0
  130.         else:
  131.             return self.imgnumber - 1
  132.  
  133.     
  134.     def seek(self, frame):
  135.         if self.istack == 0:
  136.             return None
  137.         
  138.         if frame >= self.nimages:
  139.             raise EOFError, 'attempt to seek past end of file'
  140.         
  141.         self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes)
  142.         self.fp = self._SpiderImageFile__fp
  143.         self.fp.seek(self.stkoffset)
  144.         self._open()
  145.  
  146.     
  147.     def convert2byte(self, depth = 255):
  148.         (min, max) = self.getextrema()
  149.         m = 1
  150.         if max != min:
  151.             m = depth / (max - min)
  152.         
  153.         b = -m * min
  154.         return self.point((lambda i, m = m, b = b: i * m + b)).convert('L')
  155.  
  156.     
  157.     def tkPhotoImage(self):
  158.         import ImageTk as ImageTk
  159.         return ImageTk.PhotoImage(self.convert2byte(), palette = 256)
  160.  
  161.  
  162.  
  163. def loadImageSeries(filelist = None):
  164.     if filelist == None or len(filelist) < 1:
  165.         return None
  166.     
  167.     imglist = []
  168.     for img in filelist:
  169.         if not os.path.exists(img):
  170.             print 'unable to find %s' % img
  171.             continue
  172.         
  173.         
  174.         try:
  175.             im = Image.open(img).convert2byte()
  176.         except:
  177.             if not isSpiderImage(img):
  178.                 print img + ' is not a Spider image file'
  179.                 continue
  180.             continue
  181.  
  182.         im.info['filename'] = img
  183.         imglist.append(im)
  184.     
  185.     return imglist
  186.  
  187.  
  188. def makeSpiderHeader(im):
  189.     (nsam, nrow) = im.size
  190.     lenbyt = nsam * 4
  191.     labrec = 1024 / lenbyt
  192.     if 1024 % lenbyt != 0:
  193.         labrec += 1
  194.     
  195.     labbyt = labrec * lenbyt
  196.     hdr = []
  197.     nvalues = labbyt / 4
  198.     for i in range(nvalues):
  199.         hdr.append(0)
  200.     
  201.     if len(hdr) < 23:
  202.         return []
  203.     
  204.     hdr[1] = 1
  205.     hdr[2] = float(nrow)
  206.     hdr[5] = 1
  207.     hdr[12] = float(nsam)
  208.     hdr[13] = float(labrec)
  209.     hdr[22] = float(labbyt)
  210.     hdr[23] = float(lenbyt)
  211.     hdr = hdr[1:]
  212.     hdr.append(0)
  213.     hdrstr = []
  214.     for v in hdr:
  215.         hdrstr.append(struct.pack('f', v))
  216.     
  217.     return hdrstr
  218.  
  219.  
  220. def _save(im, fp, filename):
  221.     if im.mode[0] != 'F':
  222.         im = im.convert('F')
  223.     
  224.     hdr = makeSpiderHeader(im)
  225.     if len(hdr) < 256:
  226.         raise IOError, 'Error creating Spider header'
  227.     
  228.     
  229.     try:
  230.         fp = open(filename, 'wb')
  231.     except:
  232.         raise IOError, 'Unable to open %s for writing' % filename
  233.  
  234.     fp.writelines(hdr)
  235.     rawmode = 'F;32NF'
  236.     ImageFile._save(im, fp, [
  237.         ('raw', (0, 0) + im.size, 0, (rawmode, 0, 1))])
  238.     fp.close()
  239.  
  240.  
  241. def _save_spider(im, fp, filename):
  242.     (fn, ext) = os.path.splitext(filename)
  243.     Image.register_extension('SPIDER', ext)
  244.     _save(im, fp, filename)
  245.  
  246. Image.register_open('SPIDER', SpiderImageFile)
  247. Image.register_save('SPIDER', _save_spider)
  248. if __name__ == '__main__':
  249.     if not sys.argv[1:]:
  250.         print 'Syntax: python SpiderImagePlugin.py Spiderimage [outfile]'
  251.         sys.exit()
  252.     
  253.     filename = sys.argv[1]
  254.     if not isSpiderImage(filename):
  255.         print 'input image must be in Spider format'
  256.         sys.exit()
  257.     
  258.     outfile = ''
  259.     if len(sys.argv[1:]) > 1:
  260.         outfile = sys.argv[2]
  261.     
  262.     im = Image.open(filename)
  263.     print 'image: ' + str(im)
  264.     print 'format: ' + str(im.format)
  265.     print 'size: ' + str(im.size)
  266.     print 'mode: ' + str(im.mode)
  267.     print 'max, min: ', im.getextrema()
  268.     if outfile != '':
  269.         im = im.transpose(Image.FLIP_LEFT_RIGHT)
  270.         print 'saving a flipped version of %s as %s ' % (os.path.basename(filename), outfile)
  271.         im.save(outfile, 'SPIDER')
  272.     
  273.  
  274.